/**
 * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at **
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef OP_API_INC_FLASH_ATTENTION_SCORE_GRAD_H_
#define OP_API_INC_FLASH_ATTENTION_SCORE_GRAD_H_

#include "aclnn/aclnn_base.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief aclnnFlashAttentionScoreGrad的第一段接口，根据具体的计算流程，计算workspace大小。
 * @domain aclnn_ops_train
*/
aclnnStatus aclnnFlashAttentionScoreGradGetWorkspaceSize(
    const aclTensor* query, const aclTensor* keyIn, const aclTensor* value, const aclTensor* dy,
    const aclTensor* pseShiftOptional, const aclTensor* dropMaskOptional, const aclTensor* paddingMaskOptional,
    const aclTensor* attenMaskOptional, const aclTensor* softmaxMaxOptional, const aclTensor* softmaxSumOptional,
    const aclTensor* softmaxInOptional, const aclTensor* attentionInOptional, const aclIntArray* prefixOptional,
    double scaleValueOptional, double keepProbOptional, int64_t preTockensOptional, int64_t nextTockensOptional,
    int64_t headNum, char* inputLayout, int64_t innerPreciseOptional, int64_t sparseModeOptional,
    const aclTensor* dqOut, const aclTensor* dkOut, const aclTensor* dvOut, const aclTensor* dpseOut,
    uint64_t* workspaceSize, aclOpExecutor** executor);

/**
 * @brief aclnnFlashAttentionScoreGrad的第二段接口，用于执行计算。
*/
aclnnStatus aclnnFlashAttentionScoreGrad(void* workspace, uint64_t workspaceSize, aclOpExecutor* executor,
                                         const aclrtStream stream);

/**
 * @brief aclnnFlashAttentionUnpaddingScoreGrad的第一段接口，根据具体的计算流程，计算workspace大小。
 * @domain aclnn_ops_train
*/
aclnnStatus aclnnFlashAttentionUnpaddingScoreGradGetWorkspaceSize(
    const aclTensor* query, const aclTensor* keyIn, const aclTensor* value, const aclTensor* dy,
    const aclTensor* pseShiftOptional, const aclTensor* dropMaskOptional, const aclTensor* paddingMaskOptional,
    const aclTensor* attenMaskOptional, const aclTensor* softmaxMaxOptional, const aclTensor* softmaxSumOptional,
    const aclTensor* softmaxInOptional, const aclTensor* attentionInOptional, const aclIntArray* prefixOptional,
    const aclIntArray* actualSeqQLenOptional, const aclIntArray* actualSeqKvLenOptional, double scaleValueOptional,
    double keepProbOptional, int64_t preTockensOptional, int64_t nextTockensOptional, int64_t headNum,
    char* inputLayout, int64_t innerPreciseOptional, int64_t sparseModeOptional, const aclTensor* dqOut,
    const aclTensor* dkOut, const aclTensor* dvOut, const aclTensor* dpseOut, uint64_t* workspaceSize,
    aclOpExecutor** executor);

/**
 * @brief aclnnFlashAttentionUnpaddingScoreGrad的第二段接口，用于执行计算。
*/
aclnnStatus aclnnFlashAttentionUnpaddingScoreGrad(void* workspace, uint64_t workspaceSize, aclOpExecutor* executor,
                                                  const aclrtStream stream);

#ifdef __cplusplus
}
#endif

#endif  // OP_API_INC_FLASH_ATTENTION_SCORE_GRAD_H_